﻿<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Openmp实现高斯消元法</title>
  <link rel="stylesheet" href="https://stackedit.io/style.css" />
</head>

<body class="stackedit">
  <div class="stackedit__html"><h1 id="openmp实现高斯消元法">Openmp实现高斯消元法</h1>
<p><strong>计试61 张翀 2140506063</strong></p>
<h2 id="题目">题目</h2>
<p>输入系数矩阵A和向量b，用并行高斯消元方法求解线性方程组Ax=b.</p>
<h2 id="思路">思路</h2>
<p>在高斯消元法“变上三角”的过程中，矩阵一次清除一列元素，每一行的元素需要进行一次数字运算。因为行与行之间没有数据依赖，所以对每一行进行数学运算的for循环可以并行。同理，在“上三角变对角线”时也可以并行。</p>
<h2 id="代码">代码</h2>
<p>核心命令：<code>#pragma omp parallel for num_threads(num_threads)</code><br>
这条命令的含义是，紧跟代码的for循环被多个线程并行执行，线程数由参数<code>num_threads</code>确定。在两层for循环中，第一层的含义是各行依次求最大值，这个过程可以并行执行；第二层的含义是逐个比较元素而获得最大值，这个过程是串行过程。因此，应该并行第一层for循环。<br>
为方便测试时间，设计函数<code>matGene</code>生成指定大小的矩阵，<code>vecGene</code>生成指定大小的向量，生成矩阵之后求乘积，再输出结果。设计代码如附件所示。</p>
<h2 id="实验结果">实验结果</h2>
<p>使用如下命令编译并执行：<code>g++ -fopenmp main.cpp &amp;&amp; ./a.out mat_dim num_threads</code>，执行可执行文件时带的两个参数分别是矩阵维度和使用的线程数。<br>
测试时间如下：</p>
<p><img alt="OpenMP并行高斯消元法时间展示" src="https://gitee.com/WinterShiver/HPC/raw/master/OpenMP/3-gauss-elimi/time_cmp_core.png"></p>
<p>以上为程序运行时间的测试结果展示，为方便展示，横坐标取对数。由图像可见，通过2线程并行执行程序，程序确实能获得近似为2的加速比。</p>
</div>
</body>

</html>
